/*
 * @Author: wrngygy
 * @Date: 2025-07-01
 * @Description: Vue Router 配置文件
 */

import { createRouter, createWebHistory } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'
import type { AppRouteRecordRaw } from './types'
import { useTokenStore } from '@/store'
import { ElMessage } from 'element-plus'

// 导入路由模块
import { basicRoutes } from '@/router/routes/basic'
import { authRoutes } from '@/router/routes/auth'

// 合并所有路由
const routes: AppRouteRecordRaw[] = [...basicRoutes, ...authRoutes]
// 创建路由实例
const router = createRouter({
	history: createWebHistory(import.meta.env.BASE_URL),
	routes: routes as RouteRecordRaw[],
	// 滚动行为
	scrollBehavior(to, from, savedPosition) {
		if (savedPosition) {
			return savedPosition
		} else {
			return { top: 0 }
		}
	},
})

// 路由白名单（不需要登录的页面）
const whiteList = [
	'/login',
	'/layout',
	'/register',
	'/404',
	'/403',
	'/500',
	'/',
]

// 全局前置守卫
router.beforeEach(async (to, from, next) => {
	// 开始加载进度条
	// NProgress.start()

	const tokenStore = useTokenStore()
	const token = tokenStore.getToken()

	// 设置页面标题
	if (to.meta?.title) {
		document.title = `${to.meta.title} - 微信小程序管理系统`
	} else {
		document.title = '微信小程序管理系统'
	}

	// 如果有 token
	if (token) {
		if (to.path === '/login') {
			// 已登录用户访问登录页，重定向到首页
			next({ path: '/' })
		} else {
			// 检查是否需要权限验证
			if (to.meta?.requiresAuth !== false) {
				const hasPermission = await checkPermission(to)
				if (hasPermission) {
					next()
				} else {
					ElMessage.error('权限不足，无法访问该页面')
					next({ path: '/403' })
				}
			} else {
				next()
			}
		}
	} else {
		// 没有 token
		next()
		return
		if (whiteList.includes(to.path)) {
			// 在白名单中，直接访问
			next()
		} else {
			// 不在白名单中，重定向到登录页
			ElMessage.warning('请先登录')
			next(`/login?redirect=${to.path}`)
		}
	}
})

// 全局后置守卫
router.afterEach((to, from) => {
	// 结束加载进度条
	// NProgress.done()

	// 记录路由访问日志
	console.log(`路由跳转: ${from.path} -> ${to.path}`)
})

// 权限检查函数
async function checkPermission(to: any): Promise<boolean> {
	const tokenStore = useTokenStore()

	// 如果路由不需要权限验证
	if (!to.meta?.requiresAuth) {
		return true
	}

	// 检查用户权限
	const userPermissions = tokenStore.getPermissions()
	const userRoles = tokenStore.getRoles()

	// 检查所需权限
	if (to.meta.permissions && to.meta.permissions.length > 0) {
		const hasPermission = to.meta.permissions.some((permission: string) =>
			userPermissions.includes(permission)
		)
		if (!hasPermission) {
			return false
		}
	}

	// 检查所需角色
	if (to.meta.roles && to.meta.roles.length > 0) {
		const hasRole = to.meta.roles.some((role: string) =>
			userRoles.includes(role)
		)
		if (!hasRole) {
			return false
		}
	}

	return true
}

// 路由错误处理
router.onError((error) => {
	console.error('路由错误:', error)
	ElMessage.error('页面加载失败，请重试')
})

export default router
